package com.ruoyi.task.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.minio.MinioTemplate;
import com.ruoyi.task.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;

@Service

public class UploadServiceImpl implements UploadService {
    @Autowired
    private MinioTemplate minioTemplate;  //将minioTemplate导入进来

    @Value("${minio.url}")
    private String url;
    @Value("${minio.bucketName}")
    private String bucketName;

    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @Override
    public AjaxResult upload(MultipartFile file) {
        try {
            // 前置校验
            preCheck(file);
            // 源文件名
            String fileName = file.getOriginalFilename();
            // UUID
            String uuid = IdUtil.simpleUUID();
            // 文件后缀
            String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
            // 根据 文件后缀名 生成 文件名
            String folderName = generateFolderName(fileSuffix); //生成根据日期的文件夹名称
            // 文件地址
            String path = folderName + uuid + fileSuffix;
            // Url
            String url = minioTemplate.getObjectUrl(path);
            minioTemplate.putObject(path, file);
            HashMap<String, String> resultMap = new HashMap<>();
            resultMap.put("path", path);
            resultMap.put("url", url);
            resultMap.put("fileName", fileName);
            return AjaxResult.success(resultMap);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }
    }

    @Override
    public int delete(String url) {
        //buckname 就是在minio中的相对路径
        boolean b = minioTemplate.removeObject(url);
        return b ? 1 : 0;
    }

    /**
     * 前置校验
     */
    private void preCheck(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
        if (fileSuffix.equals(".jpg") || fileSuffix.equals(".png") || fileSuffix.equals(".jpeg")) {
            // Validate image size
            if (file.getSize() > 1024 * 1024 * 10) {
                throw new ServiceException("图片大小超过10M");
            }
        } else if (fileSuffix.equals(".doc") || fileSuffix.equals(".xls") || fileSuffix.equals(".ppt") ||
                fileSuffix.equals(".txt") || fileSuffix.equals(".pdf") || fileSuffix.equals(".mp3") || fileSuffix.equals(".docx") || fileSuffix.equals(".zip") || fileSuffix.equals(".rar")) {
            // Validate file size (not exceeding 20M)
            if (file.getSize() > 1024 * 1024 * 20 * 5) {
                throw new ServiceException("文件大小超过100M");
            }
        } else {
            throw new ServiceException("不支持的文件格式");
        }
    }


    /**
     * 根据 文件后缀名 生成 文件名
     * <p>
     * 例： image/2023/11/06
     *
     * @param fileSuffix
     * @return
     */
    private String generateFolderName(String fileSuffix) {
        String fileBucket = getFileBucket(fileSuffix);
        DateTime now = DateTime.now();
        String data = DateUtil.format(now, "yyyy/MM/dd");
        return fileBucket + data + "/";
    }

    private static String getFileBucket(String fileSuffix) {
        if (fileSuffix.equals(".jpg") || fileSuffix.equals(".png") || fileSuffix.equals(".jpeg")) {
            return "image/";
        } else if (fileSuffix.equals(".doc") || fileSuffix.equals(".docx") || fileSuffix.equals(".xls") || fileSuffix.equals(".ppt") || fileSuffix.equals(".mp3") || fileSuffix.equals(".txt") || fileSuffix.equals(".pdf")) {
            return "file/";
        } else {
            return null;
        }
    }
}
